package com.woniuxy.service.impl;

import com.woniuxy.dao.CoachDao;
import com.woniuxy.dao.UserDao;
import com.woniuxy.dao.VenueDao;
import com.woniuxy.entity.*;
import com.woniuxy.service.UserService;
import com.woniuxy.utils.CodeUtils;
import com.woniuxy.utils.LoginRegister;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;
/**
 * 用户登录注册等功能
 * 以下所有功能原厂制造
 * @Author:吴毛伟
 */
@Transactional
@Data
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    public UserDao userDao;
    @Autowired
    public VenueDao venueDao;
    @Autowired
    public CoachDao coachDao;

    @Override
    public int loginByPhoneNum(User user) {
        //通过手机号查询所有账户信息 如果查询到则登录成功
        return LoginRegister.LOGIN_SUCCESS;
    }
    @Override
    public User loginByUname(User user) {
            String pwd=user.getPwd();
            User users=userDao.selectUserByAccount(user.getUname());
            return users;
    }
    @Override
    public int selectByPhone(String phoneNumber) {
        User users=userDao.selectPhoneNum(phoneNumber);
        if (users==null){
            return LoginRegister.ACCOUNT_NOT_EXIST;
        }else {
            return LoginRegister.ACCOUNT_EXIST;
        }
    }

    @Override
    public User selectUserByPhoneNumber(String phoneNumber) {
        return userDao.selectPhoneNum(phoneNumber);
    }

    /**
	 * 通过用户id查询用户
	 */
	@Override
	public User findUserByUid(int uid) {
		return userDao.findUserByUid(uid);
	}

    /**
     * 注册
     * @param user
     * @return
     */
    @Override
    public int register(User user) {
        //首先通过传入的用户信息查询是否存在当前账号
        User users=userDao.selectUserByAccount(user.getUname());
        if (users!=null){
            //如果不为空则用户已存在，请直接登录 5
            return LoginRegister.ACCOUNT_EXIST;
        }
        if (userDao.selectPhoneNum(user.getPhoneNumber())!=null){
            //返回电话号码已存在 6
            return  LoginRegister.PHONE_EXIST;
        }
           int error=userDao.insert(user);
           if (error>0){
               //如果有条数发生改变 则返回2 注册成功
               return LoginRegister.REGISTER_SUCCESS;
           }
           //如果失败返回10 注册失败
           return LoginRegister.REGISTER_ERROR;
    }

    /**
     * 分页查询
     * @param page
     * @param uid
     * @return
     */
    @Override
    public PageBean<Relationship> getByPage(int page, int uid) {
        PageBean<Relationship> pageBean = new PageBean<Relationship>();
        int index=(page - 1) * 8;
        List<Relationship> data = userDao.getByPage(index, 8, uid);
        int total = userDao.getNums();
        System.out.println(total);
        int totalNum = userDao.getNumsOfRelationship(uid);
        pageBean.setData(data);
        pageBean.setTotalNum(totalNum);
        pageBean.setTotalPage(totalNum % 8 == 0 ? totalNum / 8 : totalNum / 8 + 1);
        pageBean.setNumsOfCurrPage(data.size());
        pageBean.setPage(page);
        pageBean.setPageSize(8);
        return pageBean;
    }

    @Override
    public int insertRelationship(Relationship relationship) {
        //首先通过当前的followed去判断我是否已经关注该学员
        if (userDao.selectRelationshipByFollowed(relationship.getFollowed())==null){
          int error=userDao.insertRelationship(relationship);
          //添加成功返回1
          return CodeUtils.INSERT_CODE;
        }
        //返回10代表该用户已关注
        return CodeUtils.AREADLY_CODE;
    }

    @Override
    public int updateUserMoney(int uid, BigDecimal money) {
        //首先通过uid去查询当前账户的余额
        User user=userDao.findUserByUid(uid);
        money=money.add(user.getMoney());
        //去数据库修改余额
        int error=userDao.updateUserMoney(uid, money);
        if (error>0){
            //如果有条数发生改变 则返回1 成功
            return CodeUtils.UPDATE_CODE;
        }
        //如果失败返回10
        return CodeUtils.UPDATEFALSE_CODE;
    }

    /**
     * 查询所有用户信息
     * @return
     */
    @Override
    public List<User> selectAllUser() {
        List<User> users=userDao.selectAllUser();
        return users;
    }
    /**
     * 通过uid查询通知消息
     * @param uid
     * @return
     */

    @Override
    public List<Message> selectMessageByUid(int uid) {
        List<Message> messages=userDao.selectMessageByUid(uid);
        //将查询出来的messages遍历
        for (Message message:messages) {
            if (message.getSender()>=10000000){
                User user=userDao.findUserByUid(message.getSender());
                if (user!=null){
                    message.setName(user.getUname());
                }
            }else if (message.getSender()>=100000&&message.getSender()<10000000){
               Venue venue=venueDao.findVenueByVenueId(message.getSender());
               if (venue!=null){
                   message.setName(venue.getVname());
               }
            }else{
               Coach coach=coachDao.findCoachByCid(message.getSender());
               if (coach!=null){
                   message.setName(coach.getCname());
               }
            }
        }
        return messages;
    }

    /**
     * 传入手机号修改手机绑定
     * @param phoneNumber
     * @return
     */
    @Override
    public int updatePhoneNumberByUid(String phoneNumber,int uid) {
        //首先判断你传入的手机号是否已经有人使用
        if (userDao.selectPhoneNum(phoneNumber)!=null){
            //返回电话号码已存在 6
            return LoginRegister.PHONE_EXIST;
        }
       int error=userDao.updatePhoneNumberByUid(phoneNumber,uid);
        if (error>0){
            //如果有条数发生改变 则返回1 成功
            return CodeUtils.UPDATE_CODE;
        }
        //如果失败返回10
        return CodeUtils.UPDATEFALSE_CODE;
    }

    @Override
    public int updateisOpenByUid(int uid, String isOpen) {
        int error=userDao.updateisOpenByUid(uid,isOpen);
        if (error>0){
            //如果有条数发生改变 则返回1 成功
            return CodeUtils.UPDATE_CODE;
        }
        //如果失败返回10
        return CodeUtils.UPDATEFALSE_CODE;
    }

    @Override
    public int updateAvatarByUid(String avatar,int uid) {
        int error=userDao.updateAvatarByUid(avatar,uid);
        if (error>0){
            //如果有条数发生改变 则返回1 成功
            return CodeUtils.UPDATE_CODE;
        }
        //如果失败返回10
        return CodeUtils.UPDATEFALSE_CODE;
    }

    @Override
    public int updateNickNameByUid(String nickname,int uid) {
        int error=userDao.updateNickNameByUid(nickname,uid);
        if (error>0){
            //如果有条数发生改变 则返回1 成功
            return CodeUtils.UPDATE_CODE;
        }
        //如果失败返回10
        return CodeUtils.UPDATEFALSE_CODE;
    }

    @Override
    public int updateQQByUid(String qq, int uid) {
        //首先判断传入的QQ有没有人已使用
        User user=userDao.selectUserByQQ(qq);
        if (user!=null){
            //如果QQ存在
            return CodeUtils.QQEXITS_CODE;
        }
        int error=userDao.updateQQByUid(qq,uid);
        if (error>0){
            //如果有条数发生改变 则返回1 成功
            return CodeUtils.UPDATE_CODE;
        }
        //如果失败返回10
        return CodeUtils.UPDATEFALSE_CODE;
    }

    @Override
    public int insertAddressByUid(String address, int uid, BigDecimal longitude, BigDecimal latitude) {
       int error=userDao.insertAddressByUid(address,uid,longitude,latitude);
        if (error>0){
            //如果有条数发生改变 则返回1 成功
            return CodeUtils.UPDATE_CODE;
        }
        //如果失败返回10
        return CodeUtils.UPDATEFALSE_CODE;
    }

    @Override
    public int updatePwdByPhoneNumber(int uid, String pwd, String phoneNumber,String repass) {
        //首先判断传入的手机号是否是当前账号的绑定手机号
        User users=userDao.findUserByUid(uid);
        if (!users.getPhoneNumber().equals(phoneNumber)||phoneNumber.trim().equals("")){
            //返回电话不存在及 不是当前用户绑定的电话号码
            return LoginRegister.PHONE_NOT_EXIST;
        }
        if (!repass.equals(users.getPwd())||repass.trim().equals("")){
            //判断输入的旧密码是否正确
            return LoginRegister.PASSWORD_ERROR;
        }
        if (pwd.equals(users.getPwd())){
            //密码相同，你还修改什么密码 返回666代表密码相同 请从新输入密码
            return CodeUtils.REPASS_CODE;
        }
        int error=userDao.updatePwdByPhoneNumber(uid,pwd);
        if (error>0){
            //如果有条数发生改变 则返回1 成功
            return CodeUtils.UPDATE_CODE;
        }
        //如果失败返回10
        return CodeUtils.UPDATEFALSE_CODE;
    }


    @Override
    public User selectUserById(int uid) {
        //首先通过获取她的uid去查询他的公开是否为公开状态 如果为 那么可以查询他的信息 2代表公开
        User user=userDao.findUserByUid(uid);
        return user;
    }

    /**
     * 查询所有关注人的信息
     * @param uid
     * @return
     */
    @Override
    public List<Relationship> selectRelationship(int uid) {
        List<Relationship> relationships=userDao.selectRelationship(uid);
        return relationships;
    }
	@Override
	public int updateUserMoneyByUidAndMoney(int uid, BigDecimal money) {
		return userDao.updateUserMoney(uid, money);
		
	}

    @Override
    public User findUserByUname(String uname) {
        return userDao.findUserByUname(uname);
    }

}
